//RadioGUI.java
//Mario Roberto Gomez Flores (12165)
//08/07/2013
//Interfaz gráfica y método main de la HDT1. Se encarga de emular una radio.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;

public class RadioGUI extends JFrame {

    /**
     * Creates new form RadioGUI
     */
    public RadioGUI() {
        radio = new Radio();
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jpBotones = new JPanel();
        jpPantalla = new JPanel();
        lblEstacion = new JLabel();
        lblFrecuencia = new JLabel();
		btnSet = new JButton();
        btnAdelante = new JButton();
        btnAtras = new JButton();
        btnEstacion = new JButton();
        btnEncender = new JButton();
        btnApagado = new JButton();

		estaciones = new JButton[12];
		for(int i=0; i<12; i++){
			estaciones[i] = new JButton();
			estaciones[i].setText(""+(i+1));
			estaciones[i].addActionListener(new ButtonListener());
			estaciones[i].setEnabled(false);
		}

		btnSet.setText("SET");

		btnSet.addActionListener(new ButtonListener());
		btnAdelante.addActionListener(new ButtonListener());
		btnAtras.addActionListener(new ButtonListener());
		btnEstacion.addActionListener(new ButtonListener());
		btnEncender.addActionListener(new ButtonListener());
		btnApagado.addActionListener(new ButtonListener());

		btnSet.setEnabled(false);
		btnAdelante.setEnabled(false);
		btnAtras.setEnabled(false);
		btnEstacion.setEnabled(false);
		btnApagado.setEnabled(false);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        jpBotones.setBorder(BorderFactory.createTitledBorder(""));

        GroupLayout jpBotonesLayout = new GroupLayout(jpBotones);
        jpBotones.setLayout(jpBotonesLayout);
        jpBotonesLayout.setHorizontalGroup(
            jpBotonesLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(jpBotonesLayout.createSequentialGroup()
                .addGroup(jpBotonesLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addGroup(jpBotonesLayout.createSequentialGroup()
                        .addComponent(estaciones[0])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[1])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[2])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[3])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[4])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[5]))
                    .addGroup(jpBotonesLayout.createSequentialGroup()
                        .addComponent(estaciones[6])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[7])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[8])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[9])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[10])
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(estaciones[11])))
                .addGap(0, 0, Short.MAX_VALUE))
            .addGroup(GroupLayout.Alignment.TRAILING, jpBotonesLayout.createSequentialGroup()
                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(btnSet)
                .addGap(124, 124, 124))
        );

        jpBotonesLayout.linkSize(SwingConstants.HORIZONTAL, new java.awt.Component[] {estaciones[0], estaciones[1], estaciones[2], estaciones[9], estaciones[10], estaciones[11], estaciones[3], estaciones[4], estaciones[5], estaciones[6], estaciones[7], estaciones[8]});

        jpBotonesLayout.setVerticalGroup(
            jpBotonesLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(jpBotonesLayout.createSequentialGroup()
                .addGroup(jpBotonesLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                    .addComponent(estaciones[0])
                    .addComponent(estaciones[1])
                    .addComponent(estaciones[2])
                    .addComponent(estaciones[3])
                    .addComponent(estaciones[4])
                    .addComponent(estaciones[5]))
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jpBotonesLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                    .addComponent(estaciones[6])
                    .addComponent(estaciones[7])
                    .addComponent(estaciones[8])
                    .addComponent(estaciones[9])
                    .addComponent(estaciones[10])
                    .addComponent(estaciones[11]))
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnSet))
        );

        jpBotonesLayout.linkSize(SwingConstants.VERTICAL, new java.awt.Component[] {estaciones[0], estaciones[1], estaciones[2], estaciones[9], estaciones[10], estaciones[11], estaciones[3], estaciones[4], estaciones[5], estaciones[6], estaciones[7], estaciones[8]});

        lblEstacion.setBackground(new java.awt.Color(0, 153, 0));
        lblEstacion.setFont(new java.awt.Font("Vrinda", 0, 36)); // NOI18N
        lblEstacion.setHorizontalAlignment(SwingConstants.CENTER);
        lblEstacion.setText("--.-");

        lblFrecuencia.setFont(new java.awt.Font("Vrinda", 0, 18)); // NOI18N
        lblFrecuencia.setHorizontalAlignment(SwingConstants.CENTER);
        lblFrecuencia.setText("--");

        btnAdelante.setText(">>");

        btnAtras.setText("<<");

        btnEstacion.setText("FM/AM");

        btnEncender.setText("ON");

        btnApagado.setText("OFF");

        GroupLayout jpPantallaLayout = new GroupLayout(jpPantalla);
        jpPantalla.setLayout(jpPantallaLayout);
        jpPantallaLayout.setHorizontalGroup(
            jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(GroupLayout.Alignment.TRAILING, jpPantallaLayout.createSequentialGroup()
                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(lblEstacion, GroupLayout.PREFERRED_SIZE, 133, GroupLayout.PREFERRED_SIZE)
                .addGap(23, 23, 23)
                .addGroup(jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addComponent(btnApagado, GroupLayout.Alignment.TRAILING)
                    .addComponent(btnEncender, GroupLayout.Alignment.TRAILING))
                .addContainerGap())
            .addGroup(jpPantallaLayout.createSequentialGroup()
                .addGap(69, 69, 69)
                .addComponent(btnAtras)
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addComponent(btnEstacion)
                    .addGroup(jpPantallaLayout.createSequentialGroup()
                        .addComponent(lblFrecuencia, GroupLayout.PREFERRED_SIZE, 49, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAdelante)))
                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jpPantallaLayout.linkSize(SwingConstants.HORIZONTAL, new java.awt.Component[] {btnEstacion, lblFrecuencia});

        jpPantallaLayout.linkSize(SwingConstants.HORIZONTAL, new java.awt.Component[] {btnApagado, btnEncender});

        jpPantallaLayout.setVerticalGroup(
            jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(jpPantallaLayout.createSequentialGroup()
                .addGroup(jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addComponent(lblEstacion, GroupLayout.PREFERRED_SIZE, 68, GroupLayout.PREFERRED_SIZE)
                    .addGroup(jpPantallaLayout.createSequentialGroup()
                        .addComponent(btnEncender)
                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnApagado)))
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jpPantallaLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                    .addComponent(lblFrecuencia, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnAdelante)
                    .addComponent(btnAtras))
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnEstacion)
                .addGap(12, 12, 12))
        );

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addComponent(jpBotones, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jpPantalla, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jpPantalla, GroupLayout.PREFERRED_SIZE, 133, GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jpBotones, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(RadioGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(RadioGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(RadioGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(RadioGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RadioGUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JButton btnAdelante;
    private JButton btnApagado;
    private JButton btnAtras;
    private JButton btnEncender;
    private JButton btnEstacion;
    private JButton btnSet;
    private JButton[] estaciones;
    private JPanel jpBotones;
    private JPanel jpPantalla;
    private JLabel lblFrecuencia;
    private JLabel lblEstacion;
    // End of variables declaration//GEN-END:variables

    //Declarar objeto Sintonizable
    private Sintonizable radio;

    private class ButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            //Obtiene la fuente del evento
            JButton source = (JButton) e.getSource();

            //Dependiendo del boton que fue seleccionado, llama al metodo correspondiente en Sintonizable
            if(source == btnAdelante){
                //Llama al metodo para cambiar la frecuencia
                radio.modificarEstacionAdelante();

                //Crea objeto DecimalFormat para no mostrar decimales innecesarios
                DecimalFormat decimales = new DecimalFormat("0.0");

                //Cambia lblEstacion para mostrar la nueva frecuencia
                lblEstacion.setText(decimales.format(radio.getEstacion()));
            }
            else if(source == btnAtras){
                //Llama al metodo para cambiar la frecuencia
                radio.modificarEstacionAtras();

                //Crea objeto DecimalFormat para no mostrar decimales innecesarios
                DecimalFormat decimales = new DecimalFormat("0.0");

                //Cambia lblEstacion para mostrar la nueva frecuencia
                lblEstacion.setText(decimales.format(radio.getEstacion()));
            }
            else if(source == btnSet){
                //Crear componentes GUI
                JPanel pedirDimensiones = new JPanel();
                pedirDimensiones.setLayout(new GridLayout(0,1));

                //Componentes para pedir el tamanyo del tablero
                pedirDimensiones.add(new JLabel("¿En qué botón desea guardar la emisora?"));
                JSpinner spinner = new JSpinner(new SpinnerNumberModel(1, 1, 12, 1));
                pedirDimensiones.add(spinner);

                //Mostrar JOptionPane con el spinner y almacenar la respuesta
                int respuesta = JOptionPane.showConfirmDialog(
                        null,						//Componente madre
                        pedirDimensiones,				//Mensaje
                        "GUARDAR EMISORA",				//Titulo
                        JOptionPane.OK_CANCEL_OPTION,			//Opciones en los botones
                        JOptionPane.QUESTION_MESSAGE);			//Tipo de mensaje

                //Si selecciono OK
                if(respuesta == JOptionPane.OK_OPTION)
                {
                    //Obtiene el numero del boton para almacenar la emisora
                    int num_boton = (int)spinner.getValue();

                    //Llama al metodo de Sintonizable para guardar la emisora actual
                    radio.guardarEstacion(radio.getFrecuencia(), radio.getEstacion(), num_boton-1);
                }
                //Si selecciono Cancel o Exit, no hace nada
            }
            else if(source == btnEncender){
                //Llama al metodo para encender la radio
                radio.encender();

                //Crea objeto DecimalFormat para no mostrar decimales innecesarios
                DecimalFormat decimales = new DecimalFormat("0.0");

                //Actualiza lblEstacion y lblFrecuencia
                lblEstacion.setText(decimales.format(radio.getEstacion()));
                lblFrecuencia.setText(radio.getFrecuencia());

                //Habilita todos los botones y deshabilita el de encender
                for(int i=0; i<12; i++)
                    estaciones[i].setEnabled(true);

                btnSet.setEnabled(true);
		btnAdelante.setEnabled(true);
		btnAtras.setEnabled(true);
		btnEstacion.setEnabled(true);
		btnApagado.setEnabled(true);

                btnEncender.setEnabled(false);
            }
            else if(source == btnApagado){
                //Llama al metodo para apagar la radio
                radio.apagar();
                
                //Hace que lblEstacion y lblFrecuencia no esten visibles para emular que la radio no recibe ninguna señal
                lblEstacion.setText("--.-");
                lblFrecuencia.setText("--");

                //Deshabilita todos los botones y habilita el de encender
                for(int i=0; i<12; i++)
                    estaciones[i].setEnabled(false);

                btnSet.setEnabled(false);
		btnAdelante.setEnabled(false);
		btnAtras.setEnabled(false);
		btnEstacion.setEnabled(false);
		btnApagado.setEnabled(false);

                btnEncender.setEnabled(true);
            }
            else if(source == btnEstacion){
                //Llama al metodo de Sintonizable para cambiar frecuencias
                radio.cambiarFrecuencia();

                //Crea objeto DecimalFormat para no mostrar decimales innecesarios
                DecimalFormat decimales = new DecimalFormat("0.0");

                //Actualiza lblEstacion y lblFrecuencia
                lblEstacion.setText(decimales.format(radio.getEstacion()));
                lblFrecuencia.setText(radio.getFrecuencia());
            }
            //Si no fue ninguno de esos, fue alguno de los botones de emisoras
            else{
                //Busca cual fue
                for(int i=0; i<12; i++){
                    //Si encontro cual fue
                    if(source==estaciones[i]){
                        //Llama al metodo para cambiar a esa estacion
                        radio.modificarEstacionBoton(i);

                        //Crea objeto DecimalFormat para no mostrar decimales innecesarios
                        DecimalFormat decimales = new DecimalFormat("0.0");

                        //Actualiza lblEstacion y lblFrecuencia
                        lblEstacion.setText(decimales.format(radio.getEstacion()));
                        lblFrecuencia.setText(radio.getFrecuencia());

                        //Finaliza el ciclo
                        i=12;
                    }
                    //Si no lo encontro, sigue buscando
                }
            }
        }
    }
}
